"""
list的一些简单介绍
"""

def testList():
	# List和数组非常相似，但是要注意其中的区别
	squares = [1, 4, 9, 16, 25]

	print("isinstance(squares, list) is {}".format(isinstance(squares, list)))

	# list和str非常相似，可以使用index和slice
	print("squares[2] is {0} and squares[-2] is {1}".format(squares[2], squares[-2]))
	print("use slice, squares[-3:] is {}".format(squares[-3:]))

	# 所有的slice操作都是返回一个新的list，id是不一样的, 也就是说是两个不同的对象
	print("id(squares) is {0}, id(squares[:]) is {1}".format(id(squares), id(squares[:])))

	# 连接符 + 
	print("squares + [36, 49] = {}".format(squares + [36, 49]))

	# str的元素内容是不可以修改的，但是list是可以修改的
	cubes = [1, 8, 27, 65]
	cubes[-1] = 64
	print("cubes is {}".format(cubes))

	# 也可以通过切片修改内容，或者修改和删除list的大小
	letters = ['a', 'b', 'c', 'd', 'e', 'f']
	print("letters is {}".format(letters))

	letters[2:4] = ['C', 'D']
	print("letters is {}".format(letters))

	# 移除letters所有元素
	letters[:] = []
	print("len of letters is {}".format(letters))

	# list是可以嵌套list的，类似于多维数组
	charsList = ['a', 'b']
	numList = [1,2]

	mixedList = [charsList, numList]
	print("mixedList is {}".format(mixedList))

def testFunction():
	fruits = ["orange", "apple", "banana", "pear", "apple", "kiwi"]
	print("fruits is {}".format(fruits))

	# 添加元素 append(x)到list最后
	# append(x) 等价于 fruits[len(fruits):] = [x]
	fruits.append("grape")
	print("fruits is {}".format(fruits))

	# 删除元素 remove(x)
	# 删除第一个在list出现的元素
	# 如果删除的元素不在list中，那么将会报错
	fruits.remove('apple')
	print("fruits is {}".format(fruits))

	# 插入元素 insert(i, x)
	# a.insert(len(a), x) 等价于a.append(x)
	fruits.insert(0,"grape")
	print("fruits is {}".format(fruits))

	# list.index(x[start[, end]])
	# 返回第一个x在list出现的index
	# 如果找不到将返回ValueError
	# 也可以限制查找的位置

	print('fruits.index("grape") is {}'.format(fruits.index("grape")))
	print('fruits.index("banana") is {}'.format(fruits.index("banana")))
	print('fruits.index("grape") is {}'.format(fruits.index("grape", 3)))

	# list.count(x)
	# 返回x在list出现的次数
	print('fruits.count("banana") is {}'.format(fruits.count("banana")))

	# list.copy()
	# 等价于list[:]
	print("fruits.copy() is {}".format(fruits.copy()))

	# list.reverse()
	# 逆序list所有元素
	print(fruits.reverse())

	# list.sort(key=None, reverse=False)
	print(fruits.sort())

	# list.pop(i)
	# 移除指定位置i的元素并且返回这个值，类似于栈的pop
	# 如果没有指定i, 那么默认pop最后一个元素
	print("fruits.pop() is {}".format(fruits.pop()))

	# list.clear()
	# 清空list, 等价于 del list[:]
	print("fruits.clear() is {}".format(fruits.clear()))

def testDelList():
	# del 有以下几个功能
	# 删除list的某个元素，和pop不一样
	# 删除list的某些slice
	# 删除整个list

	num = [-1, 1, 2,3,4,5,6]
	print("nun is {}".format(num))

	# 删除第一个元素
	del num[0]
	print("num is {}".format(num))

	# 删除某些slice
	del num[2:4]
	print("num is {}".format(num))

	# 删除整个list
	del num[:]
	print("num is {}".format(num))

def testIter():
	"""
	列表生成式---List Comprehensions
	迭代器的使用
	"""

	squares = []
	for num in range(10):
		squares.append(num ** 2)

	print("squares is {}".format(str(squares)))
	print("num is {}".format(num)) 
	
	# 这里需要注意的num在循环结束后仍然是存在的
	# 列表生成式生成list就没有这个问题
	squares = list(map(lambda x: x ** 2, range(10)))
	print("squares is {}".format(squares))

	# 来一个可读性更高的
	# 把生成的元素写在最前面
	squares = list(x ** 2 for x in range(10))
	print("squares is {}".format(squares))

	# 也可以加上if作为筛选条件，例如只取偶数的平方
	squares = list(x ** 2 for x in range(10) if x % 2 == 0)
	print("squares is {}".format(squares))

	# 也可以使用双重循环
	# 在列表生成式中，for前面的是表达式，for后面的是条件，for前可以加if else ,for后只能加if
	my = [x * y for x in range(3) for y in range(5)]
	print("my is {}".format(my))


	

	

testList()
testFunction()
testDelList()
testIter()

